1 Effect of UPSTM-Based Decorrelation on Feature Discovery

1.0.1 Loading the libraries

library("FRESA.CAD")
library(readxl)
library(igraph)
library(umap)
library(tsne)
library(entropy)
library(psych)
library(whitening)
library("vioplot")
library("rpart")

op <- par(no.readonly = TRUE)
pander::panderOptions('digits', 3)
pander::panderOptions('table.split.table', 400)
pander::panderOptions('keep.trailing.zeros',TRUE)

1.1 Material and Methods

Data Source https://archive.ics.uci.edu/ml/datasets/seeds

M. Charytanowicz, J. Niewczas, P. Kulczycki, P.A. Kowalski, S. Lukasik, S. Zak, ‘A Complete Gradient Clustering Algorithm for Features Analysis of X-ray Images’, in: Information Technologies in Biomedicine, Ewa Pietka, Jacek Kawa (eds.), Springer-Verlag, Berlin-Heidelberg, 2010, pp. 15-24.

1.2 The Data

seeds <- read.delim("~/GitHub/LatentBiomarkers/Data/seeds_dataset.txt", header=FALSE)
par(cex=0.5)

featnames <- c("area",
               "perimeter",
               "compactness",
               "length_of_kernel",
               "width_of_kernel",
               "asymmetry_coeff",
               "length_ker_groove",
               "class"
)
colnames(seeds) <- featnames
seeds$class <- 1*(seeds$class == 1)
pander::pander(table(seeds$class))
0 1
140 70

1.2.1 Standarize the names for the reporting

studyName <- "Seeds"
dataframe <- seeds
outcome <- "class"
thro <- 0.80
TopVariables <- 5
cexheat = 0.45

1.3 Generaring the report

1.3.1 Libraries

Some libraries

library(psych)
library(whitening)
library("vioplot")
library("rpart")

1.3.2 Data specs

pander::pander(c(rows=nrow(dataframe),col=ncol(dataframe)-1))
rows col
210 7
pander::pander(table(dataframe[,outcome]))
0 1
140 70

varlist <- colnames(dataframe)
varlist <- varlist[varlist != outcome]

largeSet <- length(varlist) > 1500 

1.3.3 Scaling the data

Scaling and removing near zero variance columns and highly co-linear(r>0.99999) columns


  ### Some global cleaning
  sdiszero <- apply(dataframe,2,sd) > 1.0e-16
  dataframe <- dataframe[,sdiszero]

  varlist <- colnames(dataframe)[colnames(dataframe) != outcome]
  tokeep <- c(as.character(correlated_Remove(dataframe,varlist,thr=0.99999)),outcome)
  dataframe <- dataframe[,tokeep]

  varlist <- colnames(dataframe)
  varlist <- varlist[varlist != outcome]
  
  iscontinous <- sapply(apply(dataframe,2,unique),length) > 5 ## Only variables with enough samples



dataframeScaled <- FRESAScale(dataframe,method="OrderLogit")$scaledData

1.4 The heatmap of the data

numsub <- nrow(dataframe)
if (numsub > 1000) numsub <- 1000


if (!largeSet)
{

  hm <- heatMaps(data=dataframeScaled[1:numsub,],
                 Outcome=outcome,
                 Scale=TRUE,
                 hCluster = "row",
                 xlab="Feature",
                 ylab="Sample",
                 srtCol=45,
                 srtRow=45,
                 cexCol=cexheat,
                 cexRow=cexheat
                 )
  par(op)
}

1.4.0.1 Correlation Matrix of the Data

The heat map of the data


if (!largeSet)
{

  par(cex=0.6,cex.main=0.85,cex.axis=0.7)
  #cormat <- Rfast::cora(as.matrix(dataframe[,varlist]),large=TRUE)
  cormat <- cor(dataframe[,varlist],method="pearson")
  cormat[is.na(cormat)] <- 0
  gplots::heatmap.2(abs(cormat),
                    trace = "none",
  #                  scale = "row",
                    mar = c(5,5),
                    col=rev(heat.colors(5)),
                    main = "Original Correlation",
                    cexRow = cexheat,
                    cexCol = cexheat,
                     srtCol=45,
                     srtRow=45,
                    key.title=NA,
                    key.xlab="|Pearson Correlation|",
                    xlab="Feature", ylab="Feature")
  diag(cormat) <- 0
  print(max(abs(cormat)))
}

[1] 0.9943409

1.5 The decorrelation


DEdataframe <- IDeA(dataframe,verbose=TRUE,thr=thro)
#> 
#>  Included: 7 , Uni p: 0.03711537 , Uncorrelated Base: 2 , Outcome-Driven Size: 0 , Base Size: 2 
#> 
#> 
 1 <R=0.994,r=0.972,N=    3>, Top: 1( 1 )[ 1 : 1 Fa= 1 : 0.972 ]( 1 , 1 , 0 ),<|>Tot Used: 2 , Added: 1 , Zero Std: 0 , Max Cor: 0.971
#> 
 2 <R=0.971,r=0.935,N=    3>, Top: 1( 2 )[ 1 : 1 Fa= 1 : 0.935 ]( 1 , 2 , 1 ),<|>Tot Used: 4 , Added: 2 , Zero Std: 0 , Max Cor: 0.864
#> 
 3 <R=0.864,r=0.832,N=    4>, Top: 2( 1 )[ 1 : 2 Fa= 2 : 0.832 ]( 2 , 2 , 1 ),<|>Tot Used: 5 , Added: 2 , Zero Std: 0 , Max Cor: 0.825
#> 
 4 <R=0.825,r=0.800,N=    2>, Top: 1( 1 )[ 1 : 1 Fa= 2 : 0.800 ]( 1 , 1 , 2 ),<|>Tot Used: 5 , Added: 1 , Zero Std: 0 , Max Cor: 0.714
#> 
 5 <R=0.714,r=0.800,N=    0>
#> 
 [ 5 ], 0.7135263 Decor Dimension: 5 Nused: 5 . Cor to Base: 4 , ABase: 1 , Outcome Base: 0 
#> 
varlistc <- colnames(DEdataframe)[colnames(DEdataframe) != outcome]

pander::pander(sum(apply(dataframe[,varlist],2,var)))

13

pander::pander(sum(apply(DEdataframe[,varlistc],2,var)))

10.8

pander::pander(entropy(discretize(unlist(dataframe[,varlist]), 256)))

4.55

pander::pander(entropy(discretize(unlist(DEdataframe[,varlistc]), 256)))

3.73

1.5.1 The decorrelation matrix


if (!largeSet)
{

  par(cex=0.6,cex.main=0.85,cex.axis=0.7)
  
  UPSTM <- attr(DEdataframe,"UPSTM")
  
  gplots::heatmap.2(1.0*(abs(UPSTM)>0),
                    trace = "none",
                    mar = c(5,5),
                    col=rev(heat.colors(5)),
                    main = "Decorrelation matrix",
                    cexRow = cexheat,
                    cexCol = cexheat,
                   srtCol=45,
                   srtRow=45,
                    key.title=NA,
                    key.xlab="|Beta|>0",
                    xlab="Output Feature", ylab="Input Feature")
  
  par(op)
}

1.6 The heatmap of the decorrelated data

if (!largeSet)
{

  hm <- heatMaps(data=DEdataframe[1:numsub,],
                 Outcome=outcome,
                 Scale=TRUE,
                 hCluster = "row",
                 cexRow = cexheat,
                 cexCol = cexheat,
                 srtCol=45,
                 srtRow=45,
                 xlab="Feature",
                 ylab="Sample")
  par(op)
}

1.7 The correlation matrix after decorrelation

if (!largeSet)
{

  cormat <- cor(DEdataframe[,varlistc],method="pearson")
  cormat[is.na(cormat)] <- 0
  
  gplots::heatmap.2(abs(cormat),
                    trace = "none",
                    mar = c(5,5),
                    col=rev(heat.colors(5)),
                    main = "Correlation after IDeA",
                    cexRow = cexheat,
                    cexCol = cexheat,
                     srtCol=45,
                     srtRow=45,
                    key.title=NA,
                    key.xlab="|Pearson Correlation|",
                    xlab="Feature", ylab="Feature")
  
  par(op)
  diag(cormat) <- 0
  print(max(abs(cormat)))
}

[1] 0.7135263

1.8 U-MAP Visualization of features

1.8.1 The UMAP based on LASSO on Raw Data


if (nrow(dataframe) < 1000)
{
  classes <- unique(dataframe[1:numsub,outcome])
  raincolors <- rainbow(length(classes))
  names(raincolors) <- classes
  datasetframe.umap = umap(scale(dataframe[1:numsub,varlist]),n_components=2)
  plot(datasetframe.umap$layout,xlab="U1",ylab="U2",main="UMAP: Original",t='n')
  text(datasetframe.umap$layout,labels=dataframe[1:numsub,outcome],col=raincolors[dataframe[1:numsub,outcome]+1])
}

1.8.2 The decorralted UMAP

if (nrow(dataframe) < 1000)
{

  datasetframe.umap = umap(scale(DEdataframe[1:numsub,varlistc]),n_components=2)
  plot(datasetframe.umap$layout,xlab="U1",ylab="U2",main="UMAP: After IDeA",t='n')
  text(datasetframe.umap$layout,labels=DEdataframe[1:numsub,outcome],col=raincolors[DEdataframe[1:numsub,outcome]+1])
}

1.9 Univariate Analysis

1.9.1 Univariate



univarRAW <- uniRankVar(varlist,
               paste(outcome,"~1"),
               outcome,
               dataframe,
               rankingTest="AUC")



univarDe <- uniRankVar(varlistc,
               paste(outcome,"~1"),
               outcome,
               DEdataframe,
               rankingTest="AUC",
               )

1.9.2 Final Table


univariate_columns <- c("caseMean","caseStd","controlMean","controlStd","controlKSP","ROCAUC")

##topfive
topvar <- c(1:length(varlist)) <= TopVariables
pander::pander(univarRAW$orderframe[topvar,univariate_columns])
  caseMean caseStd controlMean controlStd controlKSP ROCAUC
asymmetry_coeff 2.67 1.1739 4.217 1.3818 9.80e-01 0.810
length_ker_groove 5.09 0.2637 5.569 0.5009 1.98e-03 0.764
compactness 0.88 0.0162 0.866 0.0254 5.69e-01 0.653
length_of_kernel 5.51 0.2315 5.689 0.5075 3.68e-04 0.562
perimeter 14.29 0.5766 14.692 1.5318 2.01e-05 0.524


topLAvar <- univarDe$orderframe$Name[str_detect(univarDe$orderframe$Name,"La_")]
topLAvar <- unique(c(univarDe$orderframe$Name[topvar],topLAvar[1:as.integer(TopVariables/2)]))
finalTable <- univarDe$orderframe[topLAvar,univariate_columns]

theLaVar <- rownames(finalTable)[str_detect(rownames(finalTable),"La_")]

pander::pander(univarDe$orderframe[topLAvar,univariate_columns])
  caseMean caseStd controlMean controlStd controlKSP ROCAUC
La_length_ker_groove 3.00 0.1832 3.365 0.1729 0.849 0.927
asymmetry_coeff 2.67 1.1739 4.217 1.3818 0.980 0.810
La_width_of_kernel 3.29 0.0455 3.255 0.0493 0.939 0.712
compactness 0.88 0.0162 0.866 0.0254 0.569 0.653
La_length_of_kernel 3.43 0.1286 3.504 0.1377 0.993 0.637

dc <- getLatentCoefficients(DEdataframe)
fscores <- attr(DEdataframe,"fscore")

theSigDc <- dc[theLaVar]
names(theSigDc) <- NULL
theSigDc <- unique(names(unlist(theSigDc)))


theFormulas <- dc[rownames(finalTable)]
deFromula <- character(length(theFormulas))
names(deFromula) <- rownames(finalTable)

pander::pander(c(mean=mean(sapply(dc,length)),total=length(dc),fraction=length(dc)/(ncol(dataframe)-1)))
mean total fraction
2.5 4 0.571


allSigvars <- names(dc)



dx <- names(deFromula)[1]
for (dx in names(deFromula))
{
  coef <- theFormulas[[dx]]
  cname <- names(theFormulas[[dx]])
  names(cname) <- cname
  for (cf in names(coef))
  {
    if (cf != dx)
    {
      if (coef[cf]>0)
      {
        deFromula[dx] <- paste(deFromula[dx],
                               sprintf("+ %5.3f*%s",coef[cf],cname[cf]))
      }
      else
      {
        deFromula[dx] <- paste(deFromula[dx],
                               sprintf("%5.3f*%s",coef[cf],cname[cf]))
      }
    }
  }
}

finalTable <- rbind(finalTable,univarRAW$orderframe[theSigDc[!(theSigDc %in% rownames(finalTable))],univariate_columns])


orgnamez <- rownames(finalTable)
orgnamez <- str_remove_all(orgnamez,"La_")
finalTable$RAWAUC <- univarRAW$orderframe[orgnamez,"ROCAUC"]
finalTable$DecorFormula <- deFromula[rownames(finalTable)]
finalTable$fscores <- fscores[rownames(finalTable)]

Final_Columns <- c("DecorFormula","caseMean","caseStd","controlMean","controlStd","controlKSP","ROCAUC","RAWAUC","fscores")

finalTable <- finalTable[order(-finalTable$ROCAUC),]
pander::pander(finalTable[,Final_Columns])
  DecorFormula caseMean caseStd controlMean controlStd controlKSP ROCAUC RAWAUC fscores
La_length_ker_groove -0.146area + 1.000length_ker_groove 3.00 0.1832 3.365 0.1729 8.49e-01 0.927 0.764 -1
asymmetry_coeff 2.67 1.1739 4.217 1.3818 9.80e-01 0.810 0.810 NA
length_ker_groove NA 5.09 0.2637 5.569 0.5009 1.98e-03 0.764 0.764 NA
La_width_of_kernel -0.204area + 0.540length_of_kernel + 1.000*width_of_kernel 3.29 0.0455 3.255 0.0493 9.39e-01 0.712 0.501 -2
compactness 0.88 0.0162 0.866 0.0254 5.69e-01 0.653 0.653 NA
La_length_of_kernel -0.145area + 1.000length_of_kernel 3.43 0.1286 3.504 0.1377 9.93e-01 0.637 0.562 1
length_of_kernel NA 5.51 0.2315 5.689 0.5075 3.68e-04 0.562 0.562 NA
area NA 14.33 1.2157 15.104 3.4347 1.39e-05 0.515 0.515 4
width_of_kernel NA 3.24 0.1776 3.266 0.4458 3.59e-03 0.501 0.501 NA

1.10 Comparing IDeA vs PCA vs EFA

1.10.1 PCA

featuresnames <- colnames(dataframe)[colnames(dataframe) != outcome]
pc <- prcomp(dataframe[,iscontinous],center = TRUE,tol=0.002)   #principal components
predPCA <- predict(pc,dataframe[,iscontinous])
PCAdataframe <- as.data.frame(cbind(predPCA,dataframe[,!iscontinous]))
colnames(PCAdataframe) <- c(colnames(predPCA),colnames(dataframe)[!iscontinous]) 
#plot(PCAdataframe[,colnames(PCAdataframe)!=outcome],col=dataframe[,outcome],cex=0.65,cex.lab=0.5,cex.axis=0.75,cex.sub=0.5,cex.main=0.75)

#pander::pander(pc$rotation)


PCACor <- cor(PCAdataframe[,colnames(PCAdataframe) != outcome])


  gplots::heatmap.2(abs(PCACor),
                    trace = "none",
  #                  scale = "row",
                    mar = c(5,5),
                    col=rev(heat.colors(5)),
                    main = "PCA Correlation",
                    cexRow = 0.5,
                    cexCol = 0.5,
                     srtCol=45,
                     srtRow= -45,
                    key.title=NA,
                    key.xlab="Pearson Correlation",
                    xlab="Feature", ylab="Feature")

1.10.2 EFA


EFAdataframe <- dataframeScaled

if (length(iscontinous) < 2000)
{
  topred <- min(length(iscontinous),nrow(dataframeScaled),ncol(predPCA)/2)
  if (topred < 2) topred <- 2
  
  uls <- fa(dataframeScaled[,iscontinous],nfactors=topred,rotate="varimax",warnings=FALSE)  # EFA analysis
  predEFA <- predict(uls,dataframeScaled[,iscontinous])
  EFAdataframe <- as.data.frame(cbind(predEFA,dataframeScaled[,!iscontinous]))
  colnames(EFAdataframe) <- c(colnames(predEFA),colnames(dataframeScaled)[!iscontinous]) 


  
  EFACor <- cor(EFAdataframe[,colnames(EFAdataframe) != outcome])
  
  
    gplots::heatmap.2(abs(EFACor),
                      trace = "none",
    #                  scale = "row",
                      mar = c(5,5),
                      col=rev(heat.colors(5)),
                      main = "EFA Correlation",
                      cexRow = 0.5,
                      cexCol = 0.5,
                       srtCol=45,
                       srtRow= -45,
                      key.title=NA,
                      key.xlab="Pearson Correlation",
                      xlab="Feature", ylab="Feature")
}

1.11 Effect on CAR modeling

par(op)
par(xpd = TRUE)
dataframe[,outcome] <- factor(dataframe[,outcome])
rawmodel <- rpart(paste(outcome,"~."),dataframe,control=rpart.control(maxdepth=3))
pr <- predict(rawmodel,dataframe,type = "class")

  ptab <- list(er="Error",detail=matrix(nrow=6,ncol=1))
  if (length(unique(pr))>1)
  {
    plot(rawmodel,main="Raw",branch=0.5,uniform = TRUE,compress = TRUE,margin=0.1)
    text(rawmodel, use.n = TRUE,cex=0.75)
    ptab <- epiR::epi.tests(table(pr==0,dataframe[,outcome]==0))
  }


pander::pander(table(dataframe[,outcome],pr))
  0 1
0 134 6
1 21 49
pander::pander(ptab)
  • detail:

    statistic est lower upper
    ap 0.2619 0.2038 0.3269
    tp 0.3333 0.2700 0.4015
    se 0.7000 0.5787 0.8038
    sp 0.9571 0.9091 0.9841
    diag.ac 0.8714 0.8185 0.9135
    diag.or 52.1111 19.8637 136.7104
    nndx 1.5217 1.2692 2.0504
    youden 0.6571 0.4877 0.7879
    pv.pos 0.8909 0.7775 0.9589
    pv.neg 0.8645 0.8004 0.9141
    lr.pos 16.3333 7.3559 36.2669
    lr.neg 0.3134 0.2188 0.4491
    p.rout 0.7381 0.6731 0.7962
    p.rin 0.2619 0.2038 0.3269
    p.tpdn 0.0429 0.0159 0.0909
    p.tndp 0.3000 0.1962 0.4213
    p.dntp 0.1091 0.0411 0.2225
    p.dptn 0.1355 0.0859 0.1996
  • tab:

      Outcome + Outcome - Total
    Test + 49 6 55
    Test - 21 134 155
    Total 70 140 210
  • method: exact

  • digits: 2

  • conf.level: 0.95

pander::pander(ptab$detail[c(5,3,4,6),])
  statistic est lower upper
5 diag.ac 0.871 0.818 0.914
3 se 0.700 0.579 0.804
4 sp 0.957 0.909 0.984
6 diag.or 52.111 19.864 136.710

par(op)
par(xpd = TRUE)
DEdataframe[,outcome] <- factor(DEdataframe[,outcome])
IDeAmodel <- rpart(paste(outcome,"~."),DEdataframe,control=rpart.control(maxdepth=3))
pr <- predict(IDeAmodel,DEdataframe,type = "class")

  ptab <- list(er="Error",detail=matrix(nrow=6,ncol=1))
  if (length(unique(pr))>1)
  {
    plot(IDeAmodel,main="IDeA",branch=0.5,uniform = TRUE,compress = TRUE,margin=0.1)
    text(IDeAmodel, use.n = TRUE,cex=0.75)
    ptab <- epiR::epi.tests(table(pr==0,DEdataframe[,outcome]==0))
  }

pander::pander(table(DEdataframe[,outcome],pr))
  0 1
0 130 10
1 7 63
pander::pander(ptab)
  • detail:

    statistic est lower upper
    ap 0.3476 0.2834 0.416
    tp 0.3333 0.2700 0.401
    se 0.9000 0.8048 0.959
    sp 0.9286 0.8726 0.965
    diag.ac 0.9190 0.8736 0.952
    diag.or 117.0000 42.5430 321.768
    nndx 1.2069 1.0822 1.476
    youden 0.8286 0.6773 0.924
    pv.pos 0.8630 0.7625 0.932
    pv.neg 0.9489 0.8976 0.979
    lr.pos 12.6000 6.8989 23.012
    lr.neg 0.1077 0.0532 0.218
    p.rout 0.6524 0.5838 0.717
    p.rin 0.3476 0.2834 0.416
    p.tpdn 0.0714 0.0348 0.127
    p.tndp 0.1000 0.0412 0.195
    p.dntp 0.1370 0.0677 0.238
    p.dptn 0.0511 0.0208 0.102
  • tab:

      Outcome + Outcome - Total
    Test + 63 10 73
    Test - 7 130 137
    Total 70 140 210
  • method: exact

  • digits: 2

  • conf.level: 0.95

pander::pander(ptab$detail[c(5,3,4,6),])
  statistic est lower upper
5 diag.ac 0.919 0.874 0.952
3 se 0.900 0.805 0.959
4 sp 0.929 0.873 0.965
6 diag.or 117.000 42.543 321.768

par(op)
par(xpd = TRUE)
PCAdataframe[,outcome] <- factor(PCAdataframe[,outcome])
PCAmodel <- rpart(paste(outcome,"~."),PCAdataframe,control=rpart.control(maxdepth=3))
pr <- predict(PCAmodel,PCAdataframe,type = "class")
ptab <- list(er="Error",detail=matrix(nrow=6,ncol=1))
if (length(unique(pr))>1)
{
  plot(PCAmodel,main="PCA",branch=0.5,uniform = TRUE,compress = TRUE,margin=0.1)
  text(PCAmodel, use.n = TRUE,cex=0.75)
  ptab <- epiR::epi.tests(table(pr==0,PCAdataframe[,outcome]==0))
}

pander::pander(table(PCAdataframe[,outcome],pr))
  0 1
0 138 2
1 23 47
pander::pander(ptab)
  • detail:

    statistic est lower upper
    ap 0.2333 0.17789 0.2965
    tp 0.3333 0.26996 0.4015
    se 0.6714 0.54878 0.7791
    sp 0.9857 0.94935 0.9983
    diag.ac 0.8810 0.82929 0.9215
    diag.or 141.0000 32.02203 620.8538
    nndx 1.5217 1.28648 2.0075
    youden 0.6571 0.49813 0.7773
    pv.pos 0.9592 0.86021 0.9950
    pv.neg 0.8571 0.79339 0.9072
    lr.pos 47.0000 11.75707 187.8870
    lr.neg 0.3333 0.23833 0.4662
    p.rout 0.7667 0.70353 0.8221
    p.rin 0.2333 0.17789 0.2965
    p.tpdn 0.0143 0.00173 0.0507
    p.tndp 0.3286 0.22095 0.4512
    p.dntp 0.0408 0.00498 0.1398
    p.dptn 0.1429 0.09276 0.2066
  • tab:

      Outcome + Outcome - Total
    Test + 47 2 49
    Test - 23 138 161
    Total 70 140 210
  • method: exact

  • digits: 2

  • conf.level: 0.95

pander::pander(ptab$detail[c(5,3,4,6),])
  statistic est lower upper
5 diag.ac 0.881 0.829 0.921
3 se 0.671 0.549 0.779
4 sp 0.986 0.949 0.998
6 diag.or 141.000 32.022 620.854


par(op)

1.11.1 EFA


  EFAdataframe[,outcome] <- factor(EFAdataframe[,outcome])
  EFAmodel <- rpart(paste(outcome,"~."),EFAdataframe,control=rpart.control(maxdepth=3))
  pr <- predict(EFAmodel,EFAdataframe,type = "class")
  
  ptab <- list(er="Error",detail=matrix(nrow=6,ncol=1))
  if (length(unique(pr))>1)
  {
    plot(EFAmodel,main="EFA",branch=0.5,uniform = TRUE,compress = TRUE,margin=0.1)
    text(EFAmodel, use.n = TRUE,cex=0.75)
    ptab <- epiR::epi.tests(table(pr==0,EFAdataframe[,outcome]==0))
  }


  pander::pander(table(EFAdataframe[,outcome],pr))
  0 1
0 133 7
1 12 58
  pander::pander(ptab)
  • detail:

    statistic est lower upper
    ap 0.3095 0.2477 0.377
    tp 0.3333 0.2700 0.401
    se 0.8286 0.7197 0.908
    sp 0.9500 0.8997 0.980
    diag.ac 0.9095 0.8623 0.945
    diag.or 91.8333 34.4026 245.137
    nndx 1.2844 1.1264 1.615
    youden 0.7786 0.6194 0.888
    pv.pos 0.8923 0.7906 0.956
    pv.neg 0.9172 0.8599 0.957
    lr.pos 16.5714 7.9870 34.382
    lr.neg 0.1805 0.1077 0.302
    p.rout 0.6905 0.6232 0.752
    p.rin 0.3095 0.2477 0.377
    p.tpdn 0.0500 0.0203 0.100
    p.tndp 0.1714 0.0918 0.280
    p.dntp 0.1077 0.0444 0.209
    p.dptn 0.0828 0.0435 0.140
  • tab:

      Outcome + Outcome - Total
    Test + 58 7 65
    Test - 12 133 145
    Total 70 140 210
  • method: exact

  • digits: 2

  • conf.level: 0.95

  pander::pander(ptab$detail[c(5,3,4,6),])
  statistic est lower upper
5 diag.ac 0.910 0.862 0.945
3 se 0.829 0.720 0.908
4 sp 0.950 0.900 0.980
6 diag.or 91.833 34.403 245.137
  par(op)